#include <linux/module.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include "led_opr.h"


// 操作管脚为gpio3_6
// 该管脚采用boot_sel[1:0]硬件配置复用功能，现单板已经配置为gpio，默认高电平，按键按下为低电平
static void __iomem *key_base; //寄存器基地址

#define gpio_phy_base  0x12180000   //key管脚物理地址
#define gpio_data key_base + 0x100 //GPIO 数据寄存器 ，0b01_0000_0000
#define gpio_dir key_base + 0x400  //GPIO 方向控制寄存器
#define gpio_is key_base + 0x404   //GPIO 中断触发寄存器
#define gpio_ibe key_base + 0x408  //GPIO 双沿触发中断寄存器
#define gpio_iev key_base + 0x40C  //GPIO 触发中断条件寄存器
#define gpio_ie key_base + 0x410   //GPIO 中断屏蔽寄存器
#define gpio_ris key_base + 0x414  //GPIO 原始中断状态寄存器
#define gpio_mis key_base + 0x418  //GPIO 屏蔽状态中断寄存器
#define gpio_ic key_base + 0x41C   //GPIO 中断清除寄存器

#define gpio_in 0x00 //配置为输入，1输出 0输入
#define gpio_out_h 0xFF
#define gpio_out_l 0x00

  
static int board_demo_led_init (void) 	   
{
	
	iowrite8(gpio_in, gpio_dir); //gpio14_2 配置为输入
	iowrite8(0x40, gpio_is);	//配置电平触发
	iowrite8(0x00, gpio_iev);	//配置下降沿触发或者是低电平触发
	iowrite8(0x00, gpio_ibe);	//配置单边沿触发
	iowrite8(0xFF, gpio_ic);	//清除中断
	iowrite8(0x40, gpio_ie);	//使能gpio3_6中断
		
	return 0;
}

static int board_demo_led_read (void)
{
    return ((*gpio_data) &  (1<<6)) ? 1 : 0; 
}

int board_demo_led_write (void)
{
	
	iowrite8(0xFF, gpio_ic); //清除中断
	return 0;
}


/* 自定义驱动设备的结构体 */
static struct led_operations board_demo_led_opr = {
	.num = 1,
	.init = board_demo_led_init, 
	.read = board_demo_led_read, 	
	.write = board_demo_led_write, 
	
};

/* 返回结构体指针 */
struct led_operations *get_board_led_opr(void)
{
	return &board_demo_led_opr;
}

